<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>JS学习</title>
		<script>
			/**Apply***/
			/*
			 * apply方法能劫持另外一个对象的方法，继承另外一个对象的属性
				Function.apply(obj,args)方法能接收两个参数
    			obj：这个对象将代替Function类里this对象
   				 args：这个是数组，它将作为参数传给Function（args-->arguments）
			 */
			function Person(name, age){
				this.name = name;
				this.age = age;
				
				this.sayhello = function(){
					console.info('hello');
				}
			}
			
			function Print(){
				this.funcName = 'Print';
				this.show = function(){
					var msg = [];
					for(var key in this) {
						if(typeof this[key] != 'function') {
							msg.push([key, ":", this[key]].join(""));
						}
					}
					console.info("Print show: \n" + msg.join("\n"));
				}
			}
			
			function Student(name,age, grade, schood) {
				Person.apply(this, arguments);/**********/
				Print.apply(this, arguments);/**********/
				this.grade = grade;
				this.school = schood;
			}
			var p1 = new Person('vic', 10);
			p1.sayhello();
			var s1 = new Student('Tom', 13,6,'六安路小学');
			s1.show();
			s1.sayhello();
			console.info(s1.funcName);
			/*
			 * 学生类本来不具备任何方法，但是在Person.apply(this,arguments)后，
			       他就具备了Person类的sayhello方法和所有属性。
			     在Print.apply(this,arguments)后就自动得到了show()方法
			 */
			/******************************/
			//利用Apply的参数数组化来提高
			console.info("1,2,4,7,12 中最大：" + Math.max(1,2,4,7,12));
			function getMax(arr) {
				return Math.max.apply(null, arr);
			}
			console.info(getMax([2,3,4,5,6,7]));
			
			
			var arr11 = [1,3,5,7];
			var arr22 = [2,4,6,8];
			Array.prototype.push.apply(arr11, arr22)
			console.info(arr11.join("-"));
			console.info(Math.min.apply(null, [1,2,3,4,5]));
			
			var a3 = [1,2,3,4];
			console.info(a3.filter(function(a){
				return a%2==0;
			}));
			
			console.info([1,2,3,4,5,6].reduce(function(a, b){
				console.info("a=" + a +",b="+b);
				return a+b;
			}));
			
			///
			console.info(typeof new Number(123));
			
			fcall(function(a){
				console.info("recall" + a);
			},'haha');
			
			function fcall(f,arg){
				console.info("arg=" + arg)
				f.call(arg);
			}
		</script>
	</head>
	<body>
	<div style="width: 100%;height: 100%;"></div>
	</body>
</html>
